/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja4;

/**
 *
 * @param <E> 
 * @author Nery Giron, Adrian Martinez, Maria Fernanda Martinez, Darwin Rivas
 */
abstract public class AbstractStack<E> 
implements Stack<E>
{
    /**
     * Nombre: empty
     * Descripcion: regresa el valor true si la pila esta vacia
     * Pre: ninguno
     * Post: solo regresa true si la pila esta vacia
     * Parametros: ninguno
     * @return valor tipo boolean 
     */
    public boolean empty()
    {
        return size() == 0;
    }
      
    /**
     * Nombre: operate
     * Descripcion: realiza la operacion con dos numeros basado en el operador ingresado
     * Pre: existen dos valores numericos y un operador
     * Post: resultado de la operacion
     * @param a de tipo float
     * @param b de tipo float
     * @param op de tipo String
     * @return valor tipo float
     */  
    @Override
    public float operate(float a, float b, String op){
        float result=0;
        if(op.equals("+")){
            result=a+b;
        }
        else if(op.equals("-")){
            result=a-b;
        }
        else if(op.equals("*")){
            result=a*b;
        }
        else if(op.equals("/")){
            if(b!=0){
                result=a/b;
            }
            else{
                System.out.println("Division por cero");
                result=0;
            }
        }
        return result;
    }
    
    /**
     * Basado en el ejemplo de http://lineadecodigo.com/java/validar-si-un-dato-es-numerico-en-java/
     * Nombre: isNumeric
     * Descripcion: verifica si los caracteres representan un valor numérico
     * Pre: existe una cadena de caracteres
     * Post: regresa true si es un número
     * @param cadena de tipo String
     * @return valor tipo boolean
     */
    @Override
    public boolean isNumeric(String cadena){
        try {
            Float.parseFloat(cadena);
            return true;
        } catch (NumberFormatException nfe){
            return false;
        }
    }
    
    
    /**
     * Nombre: isSymbol
     * Descripcion: verifica que el caracter representa un operador
     * Pre: existe una cadena con un caracter
     * Post: regresa true si es alguno de los operadores
     * @param cadena de tipo String
     * @return  valor tipo boolean
     */
    @Override
    public boolean isSymbol(String cadena){
        if(cadena.equals("+")||cadena.equals("-")||cadena.equals("*")||cadena.equals("/")) {
            return true;
        }
        else
            return false;
    }
}